Skip to content

cocos creator中定时器的使用技巧

js中常用的定时方法有setInterval\ setTimeout,同时cocos creator中也提供了schedule\ scheduleOnce

setIntervalschedule在游戏正常运行时没有明显的区别,但是在游戏最小化或者切到后台之后也就是触发cc.game.EVENT_HIDE事件后就有区别了. setInterval还会正常的执行,schedulescheduleOnce就处于暂停状态,实际上,整个游戏也都处于暂停状态.

所以在使用定时器得时候我们要考虑具体的使用场景来决定用哪种方式.

比如我们想要添加一个活动开始时间的倒计时,那么这个时间是固定的,所以会期望在游戏最小化的时候也继续执行时间减少,这个时候我们最好采用setInterval.

另外一个例子,战斗结束后有5秒时间让玩家选择奖励,这个时候如果游戏切换到后台,这个5秒的时间应该保留下来,以便玩家再次进入时进行选择,这个时候最好就采用schedule.

当然还可以在生命周期函数update中做文章,来完成定时,updateschedule也是一样问题.

代码示例:切后台行为对比

ts
const { ccclass } = cc._decorator;

@ccclass
export default class TimerDemo extends cc.Component {
    onLoad() {
        // setInterval:游戏切到后台后仍持续执行
        // 适合活动倒计时(需要真实时间流逝)
        let countDown = 60;
        setInterval(() => {
            countDown--;
            cc.log("活动倒计时(后台也在减):", countDown);
        }, 1000);

        // schedule:游戏切到后台后自动暂停
        // 适合战斗/选择等需要"保留时间"的场景
        let selectTime = 5;
        this.schedule(() => {
            selectTime--;
            cc.log("选择奖励剩余时间(后台暂停):", selectTime);
        }, 1, cc.macro.REPEAT_FOREVER);
    }
}